#![allow(unused_variables)]
fn main() {
    // * 所有权
    {
        // * 所有权规则
        // * 1. Rust 中的每一个值都有一个被称为其 所有者（owner）的变量。
        // * 2. 值有且只有一个所有者。
        // * 3. 当所有者（变量）离开作用域，这个值将被丢弃。
        {
            let s = "hello"; // * s进入作用域
                             // * do stuff with s
        } // * s离开作用域，不再有效
        {
            let mut s = String::from("hello"); // * s进入作用域
                                               // * do stuff with s
        } // * s离开作用域，不再有效
    }
    {
        // * 变量与数据交互的方式：移动
        {
            let x = 5;
            let y = x;
            println!("x = {}, y = {}", x, y);
        }
        {
            let s1 = String::from("hello");
            let s2 = s1;
            // * 这里会报错，因为String类型的数据在堆上，而且没有实现Copy trait
            // * 所以s1的所有权被移动到了s2，s1就不再有效了
            // println!("{}, world!", s1);
        }
        {
            let s1 = String::from("hello");
            let s2 = s1.clone();
            println!("s1 = {}, s2 = {}", s1, s2);
        }
        {
            let x = 5;
            let y = x.clone();
            println!("x = {}, y = {}", x, y);
        }
    }
}
